/**
 * 流程说明:
 * <p>
 * 通过规则获得计算链ID, 之后通过计算链ID获得计算链的元数据(也就是数据表中存放的数据)
 * 之后通过计算链元数据来初始化整个计算链实体.
 * <p>
 * 在初始化过程中会做绝大部分的检查, 包含(计算链以及计算单元类型检查,计算链以及计算单元的结果类型检查, 以及参数的计算链类型结果类型检查和参数的插槽类型检查).
 * 因为泛型擦除的关系, 校验相当重要.
 * 但是校验通过并不意味这计算链在运行时可用.
 * <p>
 * 符合兼容条件的计算链引用会被转化为计算单元.
 * <p>
 * 计算链的结构是一个二叉树, 初始化的顺序为深度遍历.
 * ===========================================
 * <p>
 * 引擎的计算单元和变量占位符都是不可动态生成的，需要手工编写代码来完成每个单元/变量的功能，每个计算单元和变量会根据标识符来初始化(Symbol)
 * 初次之外，计算链；公式占位符；变量占位符都是可以动态配置。
 * <p>
 * ===========================================
 * 如果某些值被迫需要在计算链全局生效, 需要装载在 {@link com.pubinfo.passbook.engine.cache.ComputeCache}
 * ComputeCache在整个计算链的计算链引用, 计算单元, 参数处理器都是共享并且唯一的.
 * 如果出现性能瓶颈, 可查看该类上的注释来优化计算单元运行时SQL查询的次数.
 */
package com.pubinfo.passbook.engine;